package com.xing.binbackend.pattern.proxy21.ecommerce.payment;

import com.google.common.util.concurrent.RateLimiter;
import java.math.BigDecimal;

// 3. 限流降级代理类（核心实现）
public class PaymentServiceProxy implements PaymentService {
    private final PaymentService target;
    private final RateLimiter rateLimiter; // Guava限流器
    private static final String FALLBACK_MSG = "系统繁忙，请稍后重试";

    public PaymentServiceProxy(PaymentService target, int qpsLimit) {
        this.target = target;
        this.rateLimiter = RateLimiter.create(qpsLimit);
    }

    @Override
    public String pay(String orderId, BigDecimal amount) {
        // 限流判断（非阻塞式）
        if (!rateLimiter.tryAcquire()) {
            return triggerFallback(orderId); // 触发降级
        }
        try {
            // 调用真实支付接口
            return target.pay(orderId, amount);
        } catch (Exception e) {
            // 异常降级处理
            return handleException(orderId, e);
        }
    }

    private String triggerFallback(String orderId) {
        // 可扩展为：1.记录失败日志 2.发送警报 3.存入重试队列
        System.out.println("[限流降级] orderId:" + orderId);
        return FALLBACK_MSG;
    }

    private String handleException(String orderId, Exception ex) {
        // 根据异常类型定制降级策略 这里应该是TimeoutException
        if (ex instanceof Exception) {
            return "支付超时，请检查订单状态";
        }
        return "支付服务暂时不可用";
    }
}
